<?php
/**
 * Classe de base
 *
 * shBase est la classe de base pour les classes sh
 * Elle permet de simuler l'accès aux accesseurs sans les déclarer
 *
 * @category librairies
 * @package sh
 * @abstract
 *
 * @author Mickaël CASTANHEIRO
 * @since 21 mai 2010
 * @version 1.0
 */
abstract class shBase {
    /*
	 * Retourne le nom de la classe
	 *
	 * @return string Nom de la classe
    */
    public function getClass() {
        return get_class($this);
    }

    /*
	 * Retourne le nom de la classe
	 *
	 * @return string Nom de la classe
    */
    public static function getStaticClass() {
        return get_called_class();
    }

    /*
	 * Lorsqu'une méthode est appellée
	 *
	 * La fonction vérifie s'il s'agit d'un accesseur
	 * et simule la fonction de ce dernier
	 *
	 * @param string [method] Méthode appellée
	 * @param array [$_arguments] Arguments passés à la méthode
	 * @return Mixed Valeur de l'accesseur ou l'objet visé pour les accesseurs en écriture (réflexivité)
    */
    public function __call($_method, $_arguments) {
        // Accesseur SET
        if ( substr($_method, 0, 3) == 'set' ) {
            $var = lcfirst(substr($_method, 3));
            if ( isset($this->{$var.'s'}) AND is_array($this->{$var.'s'}) ) {
                $this->{$var.'s'}[$_arguments[0]] = &$_arguments[1];
            }
            else {
                $this->{$var} = &$_arguments[0];
            }
            return $this;
        }

        // Accesseur GET
        elseif ( substr($_method, 0, 3) == 'get' ) {
            $var = lcfirst(substr($_method, 3));
            if ( isset($this->{$var.'s'}) AND is_array($this->{$var.'s'}) ) {
                return $this->{$var.'s'}[$_arguments[0]];
            }
            else {
                return $this->{$var};
            }
        }

        // Accesseur IS
        elseif ( substr($_method, 0, 2) == 'is' ) {
            $var = lcfirst(substr($_method, 2));
            if ( isset($this->{$var.'s'}) AND is_array($this->{$var.'s'}) ) {
                return ( isset($this->{$var.'s'}[$_arguments[0]]) AND ($this->{$var.'s'}[$_arguments[0]] !== false) );
            }
            else {
                return ( isset($this->{$var}) AND ($this->{$var} !== false) );
            }
        }

        // Accesseur ADD
        elseif ( substr($_method, 0, 3) == 'add' ) {
            if ( sizeof($_arguments) ==  1 ) {
                if ( $_arguments[0] != null )
		    $this->{lcfirst(substr($_method, 3)).'s'}[] = &$_arguments[0];
	    }
            else {
                $this->{lcfirst(substr($_method, 3)).'s'}[$_arguments[0]] = &$_arguments[1];
	    }
            return $this;
        }
        else {
            throw new Exception('Method ' .$_method.' not found for class '.$this->getClass());
        }
    }


    /*
	 * Affichage de la classe
	 *
	 * @return string Affichage de la classe
    */
    public function __toString() {
        return '<pre>' . print_r($this, true) . '</pre>';
    }
}

?>